﻿using MediatR;
using Newtonsoft.Json;
using Warehouse.Domain.DTO;
using Warehouse.Infrstructre.Interface;
using Warehouse.Read.API.Applcation.Command.AllocateCommand;
using static WMSpublic.ParseAPI;
using WMSpublic;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
using System.Linq;

namespace Warehouse.Read.API.Applcation.CommandHandlers.AllocateCommandHandlers
{
    public class AllocateListCommandHandlers : IRequestHandler<AllocateListCommand, PageDTO<AllProductListDTO>>
    {
        IWarehouseRepository wRep;
        IStorehouseRepository sRep;
        IAllocateRepository aRep;
        IAllProductRepsitory apRep;
        public AllocateListCommandHandlers(IWarehouseRepository wRep, 
            IStorehouseRepository sRep, 
            IAllocateRepository aRep, 
            IAllProductRepsitory apRep)
        {
            this.wRep = wRep;
            this.sRep = sRep;
            this.aRep = aRep;
            this.apRep = apRep;
        }

        public async Task<PageDTO<AllProductListDTO>> Handle(AllocateListCommand request, CancellationToken cancellationToken)
        {
             List<Products> products = await GetProductsList(1, 1000);
            var list = from a in await aRep.GetAllAsyns()
                        where a.IsDel == false
                        join ap in await apRep.GetAllAsyns() on a.AllocateId equals ap.AllocateId
                        join p in products on ap.ProductsID equals p.ProductsID
                        join s in await sRep.GetAllAsyns() on ap.StorehouseId equals s.StorehouseId
                        join w in await wRep.GetAllAsyns() on s.WarehouseId equals w.WarehouseId
                        group new { a, ap, p, s, w } by a.AllocateCode into g
                        select new AllProductListDTO
                        {
                            AllocateId = g.First().a.AllocateId,
                            MorderNumber=g.First().a.MorderNumber,
                            AllocateCode = g.Key,
                            ProductsID = g.First().ap.ProductsID,
                            ProductsCode = g.First().p.ProductsCode,
                            ProductsName = g.First().p.ProductsName,
                            Specs = g.First().p.Specs,
                            ProcurementNum = g.First().p.ProcurementNum,
                            WarehouseId = g.First().s.WarehouseId,
                            StorehouseId = g.First().ap.StorehouseId,
                            WarehouseName = g.First().w.WarehouseName,
                            StorehouseName = g.First().s.StorehouseName,
                            AllocateStore = g.First().a.AllocateStore,
                            AllocateState = g.First().a.AllocateState,
                            UpdName = g.First().a.UpdName,
                            UpdTime = g.First().a.UpdTime,
                            MakePerson = g.First().a.MakePerson,
                            MarkTime = g.First().a.MarkTime,
                            ARremark = g.First().a.ARremark,                                                                                                      
                            ReasonReview = g.First().a.ReasonReview
                        };
            //调拨单号
            //if (!string.IsNullOrEmpty(request.AllocateCode))
            //{
            //    list = list.Where(c => c.AllocateCode.Contains(request.AllocateCode));
            //}
            //起始时间
            if (request.StartDate != null)
            {
                list = list.Where(c => c.UpdTime >= request.StartDate);
            }
            if (request.EndDate != null)
            {
                list = list.Where(c => c.UpdTime <= request.EndDate);
            }
            //单据状态
           if (request.AllocateState != null)
            {
                list = list.Where(c => c.AllocateState == request.AllocateState);
            }
            //查看详情
            if (request.AllocateId != null)
            {
                list = list.Where(c => c.AllocateId == request.AllocateId);
            }
            PageDTO<AllProductListDTO> page = new PageDTO<AllProductListDTO>();
            page.Totalcount = list.Count();
            page.Pagecount = (int)Math.Ceiling(page.Totalcount * 1.0 / (int)request.PageSize);
            page.list = list.OrderByDescending(x => x.AllocateId).Skip((request.pageIndex - 1) * request.PageSize).Take(request.PageSize).ToList();
            return page;
        }


        /// <summary>
        /// 产品
        /// </summary>
        /// <returns></returns>
        public async Task<dynamic> GetProductsList(int pindex, int psize)
        {
            string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyNiIsInNpZCI6IjE4NTk4MDM1MDY2MzA4NTY3MDQiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2dyb3Vwc2lkIjoiMiIsImp0aSI6IjQzMzA2NmRmLWYyNjAtNDI2Ny1iYWY5LWJkMzgxZGVhZGMwYiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiLku5jmtJvlmIkiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy91cmkiOiIiLCJpc3MiOiJSZW5hb2JvMjAwNCIsImF1ZCI6IldlaWZ1d3UyMjAzQSJ9.JtV8g_mbUcJgyPC793AMsvjLkmkeuiRR9BAH6rQp8aU";
            HttpClientWrapper cilent = new HttpClientWrapper(token);

            string chanpin = "http://116.205.121.197:8000/cpd/api/ProductRead/GetAllProductInfo?pageindex=" + pindex + "&pagesize=" + psize;

            string postReponse = await cilent.GetAsync(chanpin);
            var json = JsonConvert.DeserializeObject<ApiResultList<Products>>(postReponse);
            return json.data.list;
        }


        //产品
        public class Products
        {
            /// <summary>
            /// 产品id
            /// </summary>
            public int ProductsID { get; set; }
            /// <summary>
            /// 产品编号
            /// </summary>
            public string? ProductsCode { get; set; }
            /// <summary>
            /// 产品名称
            /// </summary>
            public string? ProductsName { get; set; }
            /// <summary>
            /// 厂商编码
            /// </summary>
            public string? VendorsCode { get; set; }
            /// <summary>
            /// 内部编码
            /// </summary>
            public string? InteriorCode { get; set; }
            /// <summary>
            /// 规格
            /// </summary>
            public string? Specs { get; set; }
            /// <summary>
            /// 产品类别
            /// </summary>
            public int? ProductTypeID { get; set; }
            /// <summary>
            /// 存储单位
            /// </summary>
            public string? StorageUnits { get; set; }
            /// <summary>
            /// 预警（上）
            /// </summary>
            public int? Upperlimit { get; set; }
            /// <summary>
            /// 预警（下）
            /// </summary>
            public int? Lowerlimit { get; set; }
            /// <summary>
            /// 包装类型
            /// </summary>
            public int? WrapType { get; set; }
            /// <summary>
            /// 价格
            /// </summary>
            public decimal? Price { get; set; }
            /// <summary>
            /// 重量
            /// </summary>
            public decimal? Weight { get; set; }
            /// <summary>
            /// 默认仓库
            /// </summary>
            public int? WarehouseId { get; set; }
            /// <summary>
            /// 库位
            /// </summary>
            public int? StorehouseId { get; set; }
            /// <summary>
            /// 默认供应商
            /// </summary>
            public int? VendorId { get; set; }
            /// <summary>
            /// 默认客户
            /// </summary>
            public int? ClientId { get; set; }
            /// <summary>
            /// 描述
            /// </summary>
            public string? Describe { get; set; }
            /// <summary>
            /// 产品数量
            /// </summary>
            public int? ProcurementNum { get; set; }
            /// <summary>
            /// 公司id
            /// </summary>
            public string? Office_Id { get; set; }

            /// <summary>
            /// 用户id
            /// </summary>
            public int? User_Id { get; set; }
        }



    }
}